import java.util.ArrayList;
import java.util.List;
import ia.util.FileManager;

public class Camino {
	private List<Nodo> camino;
	private double T; /*T tiempo que ha tardado*/
	private double M; /*M cantidad maxima de nodos almacenada*/
	private double C; /*C el costo de la solucion*/
	
	
	public Camino() {
		super();
		camino = new ArrayList<Nodo>();
		T=0;
		M=0;
		C=0;
	}
	
	public Camino(List<Nodo> camino, double t, double m, double c) {
		super();
		this.camino = camino;
		T = t;
		M = m;
		C = c;
	}
	public List<Nodo> getCamino() {
		return camino;
	}
	public double getT() {
		return T;
	}
	public double getM() {
		return M;
	}
	public double getC() {
		return C;
	}
	public void setCamino(List<Nodo> camino) {
		this.camino = camino;
	}
	public void setT(double t) {
		T = t;
	}
	public void setM(double m) {
		M = m;
	}
	public void setC(double c) {
		C = c;
	}
	
	/* Elimina el nodo colocado en la posicion pos */
	public void eliminaNodo(Posicion pos){
		for(int i=1;i<camino.size()-1;i++){
			if(camino.get(i).getPos().equals(pos))
				camino.remove(i);
		}
	}
	
	/* Elimina el nodo colocado en la posicion pos y todos los nodos en la region que quede dentro del circulo de radio R */
	public void eliminaCirculo(Posicion pos, long R){
		for(int i=camino.size()-2; i>=1;i--){
			if(camino.get(i).getPos().in(pos, R)){
				camino.remove(i);
			}
		}
	}
	
	
	
	public void load(String ruta){
		camino=new ArrayList<Nodo>();
		FileManager fm = new FileManager();
		String contenido=fm.readFile(ruta);
		String contenidos[]=contenido.split("\n");
		T=Double.parseDouble(contenidos[0]);
		M=Double.parseDouble(contenidos[1]);
		C=Double.parseDouble(contenidos[2]);
		Nodo padre=null;
		Nodo actual;
		String datosNodo[], posiciones[];
		Posicion pos;
		for(int i=3;i<contenidos.length;i++){
			datosNodo = contenidos[i].split("\t");
			datosNodo[0]=datosNodo[0].substring(1, datosNodo[0].length()-1);
			posiciones=datosNodo[0].split(",");
			pos=new Posicion(Long.parseLong(posiciones[0]),Long.parseLong(posiciones[1]));
			actual=new Nodo(pos,Integer.parseInt(datosNodo[1]),Double.parseDouble(datosNodo[2]),
					Double.parseDouble(datosNodo[3]), Long.parseLong(datosNodo[4]),padre);
			actual.setDireccion(Integer.parseInt(datosNodo[5]));
			camino.add(actual);
			padre=actual;
		}
	}
	
	public void save(String ruta){
		FileManager fm = new FileManager();
		String contenido=T + "\n" + M + "\n" + C + "\n";
		for (int i=0;i<camino.size();i++){
			contenido+="(" + camino.get(i).getPos().getX() + "," + camino.get(i).getPos().getY() + ")";
			contenido+="\t" + camino.get(i).getPieza() + "\t" + camino.get(i).getCoste() + "\t" + camino.get(i).getF(); 
			contenido+="\t" + camino.get(i).getProfundidad() + "\t" + camino.get(i).getDireccion() + "\n";
		}
		fm.writeFile(ruta, contenido);
	}
	
	public String toString(){
		String s="Tiempo: " + T + "\nNo maximo de nodos: " + M + "\nCoste Solucion: " + C + "\n";
		for(int i=0;i< camino.size();i++)
			s+=camino.get(i).getPos().toString() + " - " + camino.get(i).getPieza() + "\n";
		
		return s;
	}
	
	
	
	public String toString2(int width, int height){
		String s="Tiempo: " + T + "\nNo maximo de nodos: " + M + "\nCoste Solucion: " + C + "\n";
		boolean pieza=false;
		int index=-1;
		for (int y=0; y<height;y++){
			for (int x=0; x<width;x++){
				for (int i=0;i<camino.size() && !pieza;i++)
					if (camino.get(i).getPos().equals(new Posicion(x,y))){
						pieza=true;
						index=i;
					}
				if(pieza)
					s+=camino.get(index).getPieza() + " ";
				else
					s+="0 ";
				pieza=false;
			}
			s+="\n";
		}
		return s;
	}
	
	public String toString3(){
		String s="Tiempo: " + T + "\nNo maximo de nodos: " + M + "\nCoste Solucion: " + C + "\n";
		return s;
	}
}
